#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stddef.h>


/**
 * 本地套接字 unix domain socket
 *      通信 全双工
 *      套接字用文件来标识 文件在绑定之前是不存在的
 *          服务器  不可以隐式绑定 指定绑定的文件必须不存在，如果存在则会失败
 *          客户端  可以隐式绑定
 *
 * @param argc
 * @param argv
 * @return
 */
int main(int argc,char * argv[]) {
    unlink("sock.cc");
    // 创建本地套接字
    int client_fd = socket(AF_UNIX,SOCK_STREAM,0);
    // 绑定 如果不绑定就是隐式绑定
    struct sockaddr_un myaddr;
    myaddr.sun_family = AF_UNIX;
    strcpy(myaddr.sun_path,"sock.cc");
    int client_len = offsetof(struct sockaddr_un,sun_path) +strlen(myaddr.sun_path);
    bind(client_fd,(struct sockaddr * )&myaddr,client_len);

    // 链接
    struct sockaddr_un server_addr;
    server_addr.sun_family = AF_UNIX;
    strcpy(server_addr.sun_path,"sock.s");
    connect(client_fd,(struct sockaddr *)&server_addr,sizeof(server_addr));


    // 读写
    char buf[1500] = "";
    while (1){
        memset(buf,0, sizeof(buf));
        int n = read(STDIN_FILENO,buf, sizeof(buf));
        send(client_fd,buf,n,0);
        memset(buf,0, sizeof(buf));
        n = recv(client_fd,buf, sizeof(buf),0);
        if(n <= 0){
            break;
        }
        else{
            printf("获取 ： %s",buf);
        }
    }
    // 关闭
    close(client_fd);
    return 1;
}

